package com.open.capacity.finance.service;

import com.open.capacity.finance.dto.SourcePzErrorDto;
import com.open.capacity.finance.entity.SourceFinance;
import com.open.capacity.finance.entity.SourceGLXML;
import com.open.capacity.finance.entity.SourcePz;

import com.open.capacity.commons.PageResult;
import com.open.capacity.finance.entity.SourceSHAREXML;

import java.net.MalformedURLException;
import java.util.Map;
import java.util.List;

/**
 * 导入财监数据
 *
 * @author
 * @email
 * @date 2023-01-31 16:45:00
 */
public interface SourcePzService {

    /**
     * 保存到数据库
     *
     * @param glxml
     */
    int saveGL2db(String companyId, Integer kjnd, Integer importway, SourceGLXML glxml);

    /**
     * 保存到数据库
     *
     * @param sharexml
     */
    int saveSHARE2db(String companyId, Integer kjnd, Integer importway, SourceSHAREXML sharexml);

    /**
     * 删除
     *
     * @param companyId
     */
    int deleteGL(String companyId, Integer kjnd);

    /**
     * 删除
     *
     * @param companyId
     */
    int deleteSHARE(String companyId, Integer kjnd);

    /**
     * 解析凭证数据
     */
    SourceGLXML parseGL(String companyId, Integer kjnd, String url) throws MalformedURLException;

    /**
     * 解析凭证数据
     */
    SourceSHAREXML parseSHARE(String companyId, Integer kjnd, String url) throws MalformedURLException;


    /**
     * 查询记录
     *
     * @param id
     * @return
     */
    SourcePz findById(String id);

    /**
     * 分页
     *
     * @param params
     * @return
     */
    PageResult<SourcePz> pageAll(Map<String, Object> params);

    /**
     * 列表
     *
     * @param params
     * @return
     */
    List<SourcePz> findPz(Map<String, Object> params);

    /**
     * 列表
     *
     * @param params
     * @return
     */
    List<SourcePz> findExt(Map<String, Object> params);

    /**
     * 经济分类统计分组
     *
     * @param params
     * @return
     */
    List<SourcePz> findJjflkms(Map<String, Object> params);

    //检查5.1. 收入科目检查：
    //     a) 会计科目：  1011 = 800101	 总发生额。
    //     b) 会计科目    6001 = 4001
    //	   c) 会计科目    4601 = 6601
    //	   d) 会计科目    4604 = 6604
    //	   e) 会计科目    4901 = 6901
    List<SourcePzErrorDto> checkKmEqual(List<SourcePz> pzList);


    //5.2. 检查负数情况：
    //     a) 1,5,7开头的会计科目借方余额不能为负数，贷方余额不能有数   (排除1602，1702*)
    //	   b) 2,3,4,6,8 开头的会计科目贷方余额不能为负数，借方余额不能有数 (排除3001*，3301*)
    List<SourcePzErrorDto> checkKmNegative(List<SourcePz> pzList);

    List<SourcePzErrorDto> checkKmNcyeNegative(List<SourcePz> pzList);


    //5.3  零余额检查
    //    a) 1011和800101会计科目的余额必须为0 ，800101科目的辅助项累计余额也必须为0
    List<SourcePzErrorDto> checkKmZero(List<SourcePz> pzList);


    //5.4  经济分类支出检查
    //    a) 7开头的7* 辅助项记录余额（默认只有借方额）不能为负数。
    List<SourcePzErrorDto> checkJjkmNegative(List<SourcePz> pzList);


    //  5.5  项目检查
    //    a) 预算项目维度：科目核算  8开头的8*（剔除8001开头的8001*）的期初数 + 6开头的6* 的余额 - 7开头的7*余额 结果不能为负数
    List<SourcePzErrorDto> checkXmNegative(List<SourcePz> pzList);


    //5.6  经济分类支出占比超过30%提醒
    //      710101，720101 会计科目
    //	  720101，720102 会计科目
    //	  30199/301，  30299/302，30399/303，30999/309，31099/310  占比必须小于30%；
    List<SourcePzErrorDto> checkJjkmPercent(List<SourcePz> pzList);


    //检查5.7. 检查5001的费用类型对应7001/7101的部门支出经济分类：101-301,201-302,301-303。检查出差异凭证号
    List<SourcePz> checkCostBgtEcoEqual(List<SourcePz> pzList);


    //检查5.6，	检查4601必须要有发生额。检查基础检察院有没有合并账务。
    List<SourcePzErrorDto> checkKjkmExists(List<SourcePz> pzList);

    //7，	检查100201基本户科目有没有发生额，预警基层检察院饭堂收入应该纳入单位监管，杜绝坐支现金。
    List<SourcePz> checkKjkmSrExists(List<SourcePz> pzList);

    //检查485，	400101-70010101必须大于或者等于0，400102-70010201必须大于或者等于0,460101-70010202必须大于或者等于0，460102-70010102必须大于或者等于0。
    List<SourcePzErrorDto> checkKmNegative48(List<SourcePz> pzList);
}

